/**
 * Notes: 跨项目服务辅助类
 * Date: 2025-05-01
 */

const AppError = require('../../../framework/core/app_error.js');

/**
 * 跨项目服务辅助类
 */
class CrossProjectService {
  /**
   * 调用OA项目服务
   * @param {String} method 方法名
   * @param {Array} args 参数列表
   * @returns {Promise<any>} 调用结果
   */
  static async callOAService(method, ...args) {
    if (!global.CROSS_SERVICE || !global.CROSS_SERVICE.OA) {
      throw new AppError('OA跨项目服务未注册', 40001);
    }

    const oaService = global.CROSS_SERVICE.OA;
    if (!oaService[method] || typeof oaService[method] !== 'function') {
      throw new AppError(`OA服务方法[${method}]不存在或不是函数`, 40002);
    }

    try {
      console.log(`[CROSS] 调用OA服务: ${method}`, args);
      return await oaService[method](...args);
    } catch (error) {
      console.error(`[CROSS] 调用OA服务[${method}]失败:`, error);
      throw new AppError(`调用OA服务[${method}]失败: ${error.message}`, 40003);
    }
  }

  /**
   * 调用PLM项目服务
   * @param {String} method 方法名
   * @param {Array} args 参数列表
   * @returns {Promise<any>} 调用结果
   */
  static async callPLMService(method, ...args) {
    if (!global.CROSS_SERVICE || !global.CROSS_SERVICE.PLM) {
      throw new AppError('PLM跨项目服务未注册', 40004);
    }

    const plmService = global.CROSS_SERVICE.PLM;
    if (!plmService[method] || typeof plmService[method] !== 'function') {
      throw new AppError(`PLM服务方法[${method}]不存在或不是函数`, 40005);
    }

    try {
      console.log(`[CROSS] 调用PLM服务: ${method}`, args);
      return await plmService[method](...args);
    } catch (error) {
      console.error(`[CROSS] 调用PLM服务[${method}]失败:`, error);
      throw new AppError(`调用PLM服务[${method}]失败: ${error.message}`, 40006);
    }
  }

  /**
   * 发布跨项目事件
   * @param {String} eventType 事件类型
   * @param {Object} eventData 事件数据
   * @returns {Promise<String>} 事件ID
   */
  static async publishEvent(eventType, eventData) {
    if (!global.EVENT_BUS) {
      throw new AppError('事件总线服务未初始化', 40007);
    }

    try {
      console.log(`[CROSS] 发布事件: ${eventType}`, eventData);
      return await global.EVENT_BUS.publish(eventType, eventData);
    } catch (error) {
      console.error(`[CROSS] 发布事件[${eventType}]失败:`, error);
      throw new AppError(`发布事件[${eventType}]失败: ${error.message}`, 40008);
    }
  }

  /**
   * 获取项目信息(从PLM)
   * @param {String} projectId 项目ID
   * @returns {Promise<Object>} 项目信息
   */
  static async getProjectInfo(projectId) {
    return await this.callPLMService('getProjectInfo', projectId);
  }

  /**
   * 获取用户信息(从OA)
   * @param {String} userId 用户ID
   * @returns {Promise<Object>} 用户信息
   */
  static async getUserInfo(userId) {
    return await this.callOAService('getUserInfo', userId);
  }

  /**
   * 创建审批(从OA)
   * @param {Object} approvalData 审批数据
   * @returns {Promise<Object>} 创建结果
   */
  static async createApproval(approvalData) {
    return await this.callOAService('createApproval', approvalData);
  }

  /**
   * 获取任务信息(从PLM)
   * @param {String} taskId 任务ID
   * @returns {Promise<Object>} 任务信息
   */
  static async getTaskInfo(taskId) {
    return await this.callPLMService('getTaskInfo', taskId);
  }
}

module.exports = CrossProjectService; 